
SIO_IDX equ 2Eh
SIO_DTA equ 2Fh
GPIO_BASEA_DDR equ 0A25h	

; Enter Config Mode:
	mov	dx, SIO_IDX 		; Select Index Port
	mov	al, 87h
	out	dx, al				; Write 87h Key
	mov	al, 01h
	out	dx, al				; Write 01h Key
	mov	al, 55h
	out	dx, al				; Write 55h key twice
	out	dx, al		

; Select LDN[07h] for GPIO.
	mov	dx, SIO_IDX 		; Select Index Port
	mov al, 07h				; LDN[07h] Register
    out dx, al
	mov	dx, SIO_DTA			; Select Data Port
    mov al, 07h
    out dx, al

; Enable GP0-GP7.
	mov	dx, SIO_IDX 		; Select Index Port
	mov	al, 0CDh			; GPIO0-7 Register
	out	dx, al
	mov	dx, SIO_DTA			; Select Data Port
	in	al, dx
	or	al, 11111111h		; Bit0-7 = GP0-7
	out	dx, al

; Read GP0-GP7 
	mov	dx, GPIO_BASEA_DDR 
	in	al, dx				; al = GP0-GP7

; Write GP4-GP7 
	or	al, 11110000h		; Set GP4-GP7 = High
	;and	al, 00001111h		; Set GP4-GP7 = Low
	out	dx, al
	

// C# use Winio 

           {
                SetPortValType SetPortVal = (SetPortValType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(SetPortValType));
                SetPortVal(0x2E, 0x87, 1);    // Enter to SuperIO Start Write 87h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x01, 1);    // Write 01h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);    // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);    // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x07, 1);    // LDN[07h] Register
                SetPortVal(0x2F, 0x07, 1);    // Write LDN[07h] TO Data Port
                SetPortVal(0x2E, 0xCD, 1);    // GPIO0-7 Register
                SetPortVal(0x2F, 0xF0, 1);    // Set GPIO 0-3 "0" is Input and GPIO 4-7 "F" is Output (Low is input, High is Output)
            
                GetPortVal(0xa25,&PortVal, 1); // Read GPIO Status 
            }	
               
              
            private void button2_Click(object sender, EventArgs e)
        {
            IntPtr pFunc = GetProcAddress(hMod, "SetPortVal");
            if (pFunc != IntPtr.Zero)
            {
                SetPortValType SetPortVal = (SetPortValType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(SetPortValType));
                SetPortVal(0x2E, 0x87, 1);  // Enter to SuperIO Start Write 87h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x01, 1);  // Write 01h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);  // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);  // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x07, 1);  // LDN[07h] Register
                SetPortVal(0x2F, 0x07, 1);  // Write LDN[07h] TO Data Port
                SetPortVal(0x2E, 0x73, 1);  // Set watchdog timer value
                SetPortVal(0x2F, 0x0A, 1);  // Set watchdog timer 10 Sec / Min
                SetPortVal(0x2E, 0x72, 1);  
                SetPortVal(0x2F, 0xC0, 1);  // Set watchdog timer unit to be Sec (C0 is Sec)
                SetPortVal(0x2E, 0x02, 1);
                SetPortVal(0x2F, 0x02, 1);  // Exit PNP Mode
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            IntPtr pFunc = GetProcAddress(hMod, "SetPortVal");
            if (pFunc != IntPtr.Zero)
            {
                SetPortValType SetPortVal = (SetPortValType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(SetPortValType));
                SetPortVal(0x2E, 0x87, 1);  // Enter to SuperIO Start Write 87h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x01, 1);  // Write 01h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);  // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x55, 1);  // Write 55h Key to 2E ADDRESS
                SetPortVal(0x2E, 0x07, 1);  // LDN[07h] Register
                SetPortVal(0x2F, 0x07, 1);  // Write LDN[07h] TO Data Port
                SetPortVal(0x2E, 0x73, 1);  // Set watchdog timer value
                SetPortVal(0x2F, 0x01, 1);  // Set watchdog timer 1 Min
                SetPortVal(0x2E, 0x72, 1);
                SetPortVal(0x2F, 0x40, 1);  // Set watchdog timer unit to be Min (40 is Min)
                SetPortVal(0x2E, 0x02, 1);
                SetPortVal(0x2F, 0x02, 1);  // Exit PNP Mode
            }
        }   

  
	